#ifndef SOCK5_ACCEPTNEWFD_HPP
#define SOCK5_ACCEPTNEWFD_HPP

#include "eventbuffer.hpp"
#include "eventhandler.hpp"
#include "ipaddress.hpp"

namespace oraysock5 {
/**
     * @brief 接收客户端数据处理器
    */
class AcceptNewFd : public EventHandler {
public:
    /**
         * @brief 构造
         * @param remoteAddr 客户端连接地址
         * @param listenAddr 服务器监听地址
         * @param iobuf 管理io读写缓冲区
        */
    AcceptNewFd(std::shared_ptr<IPAddress> remoteAddr,
        std::shared_ptr<IPAddress> listenAddr,
        std::shared_ptr<EventBuffer> iobuf);
    ~AcceptNewFd() = default;

    /**
         * @brief socket数据已经保存到管理io缓冲,可以读取回调
         * @return 返回SUCCESS正常没有操作,
         返回INITIATIVE_CLOSE服务器将关闭底层socket，并触发close(SERVER_CLOSE)
         返回PASSIVE_CLOSE服务器将关闭底层socket，并触发close(CLIENT_CLOSE)
        */
    virtual InputResult input() = 0;
    /**
         * @brief 指定数据已经完成发送到管理io缓冲回调
         * @return  返回0正常没有操作
         返回-1服务器将关闭底层socket，并触发close(SERVER_CLOSE)
        */
    virtual int output() { return 0; };
    /**
         * @brief 客户端连接断开回调
         * @param active 断开原因 CLIENT_CLOSE,SERVER_CLOSE,TIMEOUT_CLOSE
        */
    virtual void close(CloseType active) = 0;
    /**
         * @brief 检测到与客户端没有心跳超时回调
         * @param active 断开原因 TIMEOUT_CLOSE
        */
    virtual void timerout(CloseType active) = 0;

    /**
         * @brief 获取连接的客户端地址
         * @return 连接的客户端地址
        */
    std::shared_ptr<IPAddress> remote_addr() const;
    /**
         * @brief 获取监听的服务器地址
         * @return 监听的服务器地址
        */
    std::shared_ptr<IPAddress> listen_addr() const;

    /**
         * @brief 获取管理io缓冲
         * @return 管理io缓冲
        */
    std::shared_ptr<EventBuffer> iobuf() const { return iobuf_; }

private:
    /**
         * @brief 连接的客户端地址
        */
    std::shared_ptr<IPAddress> remote_addr_ = nullptr;
    /**
         * @brief 监听的服务器地址
        */
    std::shared_ptr<IPAddress> listen_addr_ = nullptr;
    /**
         * @brief 管理io缓冲
        */
    std::shared_ptr<EventBuffer> iobuf_;
};

}

#endif
